'''
【题目描述】
某涉密单位下发了某种票据，并要在年终全部收回。每张票据有唯一的 ID 号。
全年所有票据的 ID 号是连续的，但 ID 的开始数码是随机选定的。
因为工作人员疏忽，在录入 ID 号的时候发生了一处错误，造成了某个 ID 断号，另外一个 ID 重号。
你的任务是通过编程，找出断号的 ID 和重号的 ID 。假设断号不可能发生在最大和最小号。
【输入描述】
要求程序首先输入一个整数 N (N<100) 表示后面数据行数。接着读入 N 行数据。每行数据长度不等，是用空格分开的若干个 (不大于100个) 正整数 (不大于105)。
【输出描述】
要求程序输出 1 行，含两个整数 m,n，用空格分隔。其中，m 表示断号 ID，n 表示重号 ID。
【输入样例】
2
5 6 8 11 9
10 12 9
【输出样例】
7 9
'''

n=int(input())
a=[]                    # 定义一个空列表a以存储输入的数据。
for i in range(n):
    num=input().split()    # 读取一行输入，并将其中的数字以空格为分隔符拆分成一个列表num。
    for j in range(len(num)):
        a.append(int(num[j]))  # 读取n行数据，存到a[]，将num列表中的元素转换为整数类型并添加到列表a中。
a.sort()
for i in range(a[0],a[0]+len(a)):   # 循环从a中最小值开始，到最大值结束
    if i not in a:                  # 判断i是否不在列表a中
        ans1=i                      # 如果i不在列表a中，则将i赋给ans1，记录缺失的数字。
    if a.count(i)==2:               # 判断i在列表中出现的次数是否为2
        ans2=i                      # 如果i在列表a中出现了2次，则将i赋给ans2，记录重复的数字
print(ans1,ans2)
